package com.wechat.service;


import com.wechat.utils.beans.Pager;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface CommonService {
    
    public <T extends Serializable> T save(T model);

    public <T extends Serializable> void saveOrUpdate(T model);
    
    public <T extends Serializable> void update(T model);
    
    public <T extends Serializable> void merge(T model);

    public <T extends Serializable, PK extends Serializable> void delete(Class<T> entityClass, PK id);

    public <T extends Serializable> void deleteObject(T model);

    public <T extends Serializable, PK extends Serializable> T get(Class<T> entityClass, PK id);
    
    public <T extends Serializable> int countAll(Class<T> entityClass);
    
    public <T extends Serializable> List<T> listAll(Class<T> entityClass);

    public <T extends Serializable> List<T> findParamListByHQL(String hql, Object... values);

    public <T extends Serializable> T findByHQL(String hql, Object... values);
    /**
     * 通过属性查询唯一结果
     * @param propertyName 属性名
     * @param value 属性值
     * @return
     */
    <T extends Serializable> T findUniqueByProperty(Class<T> entityClass, final String propertyName, final Object value);


    public int countSqlQueryResult(String sql, Object... values) ;

    int countHqlQueryResult(String hql, Object... values);

    /**
     * 通过SQL查询结果集
     * @param sqlString
     * @param values
     * @return
     */
    <T extends Serializable> List<T> findListBySQL(Class<T> entityClass, final String sqlString, final Object... values);
    /**
     * 通过sql语句查询结果集
     * @param fromIndex 起始索引
     * @param size 需要获取的结果数
     * @param sqlString 实体示例
     * @param values 排除在外的属性列表
     * @return
     */
    <T extends Serializable> List<T> findListBySQL(Class<T> entityClass, final int fromIndex, final int size, final String sqlString, final Object... values);



    /**
     * 使用sql根据数据
     * @param sql 更新的sql语句
     */
    void updateBySql(String sql);
    <T extends Serializable> Pager<T> findByHQL(final int pageNo, final int pageSize, final String hql, final Object... values);

    <T extends Serializable> Pager<T> findByHQL(final int pageNo, final int pageSize, final String hql, final List<Object> valueList);


    /**
     * MrWang
     * 2015-01-18
     *
     * 使用jdbc方式查询sql 将查询的结果封装在map中，每一条记录是一个map
     * map的key是字段名（全部转换为小写） value是字段值
     * @param sql
     * @return
     */
    public List<Map<String,Object>> findByJdbcSql(String sql, Object... args);

    <T extends Serializable> List<T> findListByHQL(final int pageNo, final int pageSize, final String hql, final Object... values);


}
